package br.com.fogas.notafiscal;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.fogas.database.entidade.Canal;
import br.com.fogas.database.entidade.Cliente;
import br.com.fogas.database.entidade.CondicaoPagto;
import br.com.fogas.database.entidade.Material;
import br.com.fogas.database.entidade.Medidor;
import br.com.fogas.notafiscal.enums.PesoProdutoEnum;
import br.com.fogas.notafiscal.enums.TipoDeNotaEnum;
import br.com.fogas.notafiscal.modelo.NF;
import br.com.fogas.notafiscal.modelo.NFItem;

public class NotaFiscalBuilder {
	
	private NF nota;
	private List<NFItem> items;
	private Canal canal;
	private Cliente cliente;
	private CondicaoPagto condPgto;
	private Date dataEntrega;
	private Date dataHora;
	private Date dataNota;
	private TipoDeNotaEnum tipoNotaEnum;
	private boolean qrCodeLido;
	private Medidor medidor;
	
	public NotaFiscalBuilder() {
		this.nota = new NF();
		this.items = new ArrayList<NFItem>();
	}
	
	public NotaFiscalBuilder canal(Canal canal) {
		this.canal = canal;
		return this;
	}
	
	public NotaFiscalBuilder cliente(Cliente cliente) {
		this.cliente = cliente;
		return this;
	}
	
	public NotaFiscalBuilder condicaoPgto(CondicaoPagto condPgto) {
		this.condPgto = condPgto;
		return this;
	}
	
	public NotaFiscalBuilder dataEntrega(Date dataEntrega) {
		this.dataEntrega = dataEntrega;
		return this;
	}
	
	public NotaFiscalBuilder dataHora(Date dataHora) {
		this.dataHora = dataHora;
		return this;
	}
	
	public NotaFiscalBuilder dataNota(Date dataNota) {
		this.dataNota = dataNota;
		return this;
	}
	
	public NotaFiscalBuilder tipoNota(TipoDeNotaEnum tipoNotaEnum) {
		this.tipoNotaEnum = tipoNotaEnum;
		return this;
	}
	
	public NotaFiscalBuilder qrCodeLido(boolean qrCodeLido) {
		this.qrCodeLido = qrCodeLido;
		return this;
	}
	
	public NotaFiscalBuilder medidor(Medidor medidor) {
		this.medidor = medidor;
		return this;
	}
	
	public NotaFiscalBuilder adicionarItem(boolean granel, Material material, BigDecimal quantidade, PesoProdutoEnum peso) {
		NFItem item = new NFItem(true, material, quantidade, peso);
		this.items.add(item);
		return this;
	}
	
	public NF notaFiscal() {
		nota.setCanal(canal);
		nota.setCliente(cliente);
		nota.setCondicaoPagto(condPgto);
		nota.setDataEntrega(dataEntrega);
		nota.setDataHora(dataHora);
		nota.setDataNota(dataNota);
		nota.setTipoDeNota(tipoNotaEnum);
		nota.setItems(items);
		nota.setMedidor(medidor);
		nota.setQrCodeLido(qrCodeLido);
		return nota;
	}
}